Computer systems typically operate according to instructions encoded in software. To make the instructions accessible to a computer system, the software is first installed on a computer-readable medium such as a compact disc, a disk drive, flash memory, network-attached storage (NAS), etc. The instructions are then loaded into the computer system's memory from the computer-readable medium and subsequently executed by the computer system's processor(s).
In many cases, software includes multiple subcomponents. Some or all of these subcomponents may depend on each other's presence in the computer system's memory to function correctly. Further, some subcomponents may be incompatible with each other, or may be compatible only with particular versions of each other. Therefore, for the software to function correctly, the correct subcomponents are generally required. Incorrect combinations of subcomponents may result in unexpected results such as invalid data, memory faults, system crashes, etc.
Determining the correct subcomponents for software is typically a manual task, requiring a user to correctly identify the dependencies and incompatibilities between individual subcomponents. Depending on the number of subcomponents, this task can be daunting, even for those developing the software. For example, multiple versions of subcomponents may exist, and the dependencies and incompatibilities between subcomponents may not be immediately apparent.
Further, obtaining those subcomponents may be a complicated task in itself, especially if all the subcomponents are not accessible from a single source. The user may effectively be required to not only know the dependencies and incompatibilities between subcomponents, but also where to obtain those subcomponents. Therefore, the ability to obtain and install software sometimes requires a breadth of knowledge and technical expertise not available to a typical user.